/* Processed by ecpg (regression mode) */
/* These include files are added by the preprocessor */
#include <ecpglib.h>
#include <ecpgerrno.h>
#include <sqlca.h>
/* End of automatic include section */
#define ECPGdebug(X, Y) ECPGdebug((X) + 100, (Y))

#line 1 "outofscope.pgc"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

#line 1 "regression.h"

#line 6 "outofscope.pgc"

#line 1 "pgtypes_numeric.h"
#ifndef PGTYPES_NUMERIC
#define PGTYPES_NUMERIC

#define NUMERIC_POS 0x0000
#define NUMERIC_NEG 0x4000
#define NUMERIC_NAN 0xC000
#define NUMERIC_NULL 0xF000
#define NUMERIC_MAX_PRECISION 1000
#define NUMERIC_MAX_DISPLAY_SCALE NUMERIC_MAX_PRECISION
#define NUMERIC_MIN_DISPLAY_SCALE 0
#define NUMERIC_MIN_SIG_DIGITS 16

#define DECSIZE 30

typedef unsigned char NumericDigit;
typedef struct {
    int ndigits;          /* number of digits in digits[] - can be 0! */
    int weight;           /* weight of first digit */
    int rscale;           /* result scale */
    int dscale;           /* display scale */
    int sign;             /* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */
    NumericDigit* buf;    /* start of alloc'd space for digits[] */
    NumericDigit* digits; /* decimal digits */
} numeric;

typedef struct {
    int ndigits;                  /* number of digits in digits[] - can be 0! */
    int weight;                   /* weight of first digit */
    int rscale;                   /* result scale */
    int dscale;                   /* display scale */
    int sign;                     /* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */
    NumericDigit digits[DECSIZE]; /* decimal digits */
} decimal;

#ifdef __cplusplus
extern "C" {
#endif

numeric* PGTYPESnumeric_new(void);
decimal* PGTYPESdecimal_new(void);
void PGTYPESnumeric_free(numeric*);
void PGTYPESdecimal_free(decimal*);
numeric* PGTYPESnumeric_from_asc(char*, char**);
char* PGTYPESnumeric_to_asc(numeric*, int);
int PGTYPESnumeric_add(numeric*, numeric*, numeric*);
int PGTYPESnumeric_sub(numeric*, numeric*, numeric*);
int PGTYPESnumeric_mul(numeric*, numeric*, numeric*);
int PGTYPESnumeric_div(numeric*, numeric*, numeric*);
int PGTYPESnumeric_cmp(numeric*, numeric*);
int PGTYPESnumeric_from_int(signed int, numeric*);
int PGTYPESnumeric_from_long(signed long int, numeric*);
int PGTYPESnumeric_copy(numeric*, numeric*);
int PGTYPESnumeric_from_double(double, numeric*);
int PGTYPESnumeric_to_double(numeric*, double*);
int PGTYPESnumeric_to_int(numeric*, int*);
int PGTYPESnumeric_to_long(numeric*, long*);
int PGTYPESnumeric_to_decimal(numeric*, decimal*);
int PGTYPESnumeric_from_decimal(decimal*, numeric*);

#ifdef __cplusplus
}
#endif

#endif /* PGTYPES_NUMERIC */

#line 8 "outofscope.pgc"

/* exec sql begin declare section */

#line 1 "struct.h"

/* dec_t */

typedef struct mytype MYTYPE;

#line 9 "struct.h"

typedef struct mynulltype MYNULLTYPE;

#line 19 "struct.h"

#line 11 "outofscope.pgc"

struct mytype {
#line 3 "struct.h"
    int id;

#line 4 "struct.h"
    char t[64];

#line 5 "struct.h"
    double d1;

#line 6 "struct.h"
    double d2;

#line 7 "struct.h"
    char c[30];
};
struct mynulltype {
#line 13 "struct.h"
    int id;

#line 14 "struct.h"
    int t;

#line 15 "struct.h"
    int d1;

#line 16 "struct.h"
    int d2;

#line 17 "struct.h"
    int c;
}; /* exec sql end declare section */
#line 12 "outofscope.pgc"

/* exec sql whenever sqlerror  stop ; */
#line 14 "outofscope.pgc"

/* Functions for test 1 */

static void get_var1(MYTYPE** myvar0, MYNULLTYPE** mynullvar0)
{
    /* exec sql begin declare section */

#line 22 "outofscope.pgc"
    MYTYPE* myvar = malloc(sizeof(MYTYPE));

#line 23 "outofscope.pgc"
    MYNULLTYPE* mynullvar = malloc(sizeof(MYNULLTYPE));
/* exec sql end declare section */
#line 24 "outofscope.pgc"

    /* Test DECLARE ... SELECT ... INTO with pointers */

    ECPGset_var(0, (myvar), __LINE__);
    ECPGset_var(1, (mynullvar), __LINE__); /* declare mycur cursor for select * from a1 */
#line 28 "outofscope.pgc"

    if (sqlca.sqlcode != 0)
        exit(1);

    *myvar0 = myvar;
    *mynullvar0 = mynullvar;
}

static void open_cur1(void)
{
    {
        ECPGdo(__LINE__,
            0,
            1,
            NULL,
            0,
            ECPGst_normal,
            "declare mycur cursor for select * from a1",
            ECPGt_EOIT,
            ECPGt_int,
            &((*(MYTYPE*)(ECPGget_var(0))).id),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_int,
            &((*(MYNULLTYPE*)(ECPGget_var(1))).id),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_char,
            &((*(MYTYPE*)(ECPGget_var(0))).t),
            (long)64,
            (long)1,
            (64) * sizeof(char),
            ECPGt_int,
            &((*(MYNULLTYPE*)(ECPGget_var(1))).t),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_double,
            &((*(MYTYPE*)(ECPGget_var(0))).d1),
            (long)1,
            (long)1,
            sizeof(double),
            ECPGt_int,
            &((*(MYNULLTYPE*)(ECPGget_var(1))).d1),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_double,
            &((*(MYTYPE*)(ECPGget_var(0))).d2),
            (long)1,
            (long)1,
            sizeof(double),
            ECPGt_int,
            &((*(MYNULLTYPE*)(ECPGget_var(1))).d2),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_char,
            &((*(MYTYPE*)(ECPGget_var(0))).c),
            (long)30,
            (long)1,
            (30) * sizeof(char),
            ECPGt_int,
            &((*(MYNULLTYPE*)(ECPGget_var(1))).c),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_EORT);
#line 40 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 40 "outofscope.pgc"

    if (sqlca.sqlcode != 0)
        exit(1);
}

static void get_record1(void)
{
    {
        ECPGdo(__LINE__,
            0,
            1,
            NULL,
            0,
            ECPGst_normal,
            "fetch mycur",
            ECPGt_EOIT,
            ECPGt_int,
            &((*(MYTYPE*)(ECPGget_var(0))).id),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_int,
            &((*(MYNULLTYPE*)(ECPGget_var(1))).id),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_char,
            &((*(MYTYPE*)(ECPGget_var(0))).t),
            (long)64,
            (long)1,
            (64) * sizeof(char),
            ECPGt_int,
            &((*(MYNULLTYPE*)(ECPGget_var(1))).t),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_double,
            &((*(MYTYPE*)(ECPGget_var(0))).d1),
            (long)1,
            (long)1,
            sizeof(double),
            ECPGt_int,
            &((*(MYNULLTYPE*)(ECPGget_var(1))).d1),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_double,
            &((*(MYTYPE*)(ECPGget_var(0))).d2),
            (long)1,
            (long)1,
            sizeof(double),
            ECPGt_int,
            &((*(MYNULLTYPE*)(ECPGget_var(1))).d2),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_char,
            &((*(MYTYPE*)(ECPGget_var(0))).c),
            (long)30,
            (long)1,
            (30) * sizeof(char),
            ECPGt_int,
            &((*(MYNULLTYPE*)(ECPGget_var(1))).c),
            (long)1,
            (long)1,
            sizeof(int),
            ECPGt_EORT);
#line 49 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 49 "outofscope.pgc"

    if (sqlca.sqlcode != 0 && sqlca.sqlcode != ECPG_NOT_FOUND)
        exit(1);
}

static void close_cur1(void)
{
    {
        ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur", ECPGt_EOIT, ECPGt_EORT);
#line 58 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 58 "outofscope.pgc"

    if (sqlca.sqlcode != 0)
        exit(1);
}

int main(void)
{
    MYTYPE* myvar = NULL;
    MYNULLTYPE* mynullvar = NULL;

    char msg[128];

    ECPGdebug(1, stderr);

    strcpy(msg, "connect");
    {
        ECPGconnect(__LINE__, 0, "regress1", NULL, NULL, NULL, 0);
#line 75 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 75 "outofscope.pgc"

    strcpy(msg, "set");
    {
        ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "set datestyle to iso", ECPGt_EOIT, ECPGt_EORT);
#line 78 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 78 "outofscope.pgc"

    strcpy(msg, "create");
    {
        ECPGdo(__LINE__,
            0,
            1,
            NULL,
            0,
            ECPGst_normal,
            "create table a1 ( id serial primary key , t text , d1 numeric , d2 float8 , c character ( 10 ) )",
            ECPGt_EOIT,
            ECPGt_EORT);
#line 81 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 81 "outofscope.pgc"

    strcpy(msg, "insert");
    {
        ECPGdo(__LINE__,
            0,
            1,
            NULL,
            0,
            ECPGst_normal,
            "insert into a1 ( id , t , d1 , d2 , c ) values ( default , 'a' , 1.0 , 2 , 'a' )",
            ECPGt_EOIT,
            ECPGt_EORT);
#line 84 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 84 "outofscope.pgc"

    {
        ECPGdo(__LINE__,
            0,
            1,
            NULL,
            0,
            ECPGst_normal,
            "insert into a1 ( id , t , d1 , d2 , c ) values ( default , null , null , null , null )",
            ECPGt_EOIT,
            ECPGt_EORT);
#line 85 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 85 "outofscope.pgc"

    {
        ECPGdo(__LINE__,
            0,
            1,
            NULL,
            0,
            ECPGst_normal,
            "insert into a1 ( id , t , d1 , d2 , c ) values ( default , 'b' , 2.0 , 3 , 'b' )",
            ECPGt_EOIT,
            ECPGt_EORT);
#line 86 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 86 "outofscope.pgc"

    strcpy(msg, "commit");
    {
        ECPGtrans(__LINE__, NULL, "commit");
#line 89 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 89 "outofscope.pgc"

    /* Test out-of-scope DECLARE/OPEN/FETCH/CLOSE */

    get_var1(&myvar, &mynullvar);
    open_cur1();

    /* exec sql whenever not found  break ; */
#line 96 "outofscope.pgc"

    while (1) {
        memset(myvar, 0, sizeof(MYTYPE));
        get_record1();
        if (sqlca.sqlcode == ECPG_NOT_FOUND)
            break;
        printf("id=%d%s t='%s'%s d1=%lf%s d2=%lf%s c = '%s'%s\n",
            myvar->id,
            mynullvar->id ? " (NULL)" : "",
            myvar->t,
            mynullvar->t ? " (NULL)" : "",
            myvar->d1,
            mynullvar->d1 ? " (NULL)" : "",
            myvar->d2,
            mynullvar->d2 ? " (NULL)" : "",
            myvar->c,
            mynullvar->c ? " (NULL)" : "");
    }

    close_cur1();

    strcpy(msg, "drop");
    {
        ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table a1", ECPGt_EOIT, ECPGt_EORT);
#line 115 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 115 "outofscope.pgc"

    strcpy(msg, "commit");
    {
        ECPGtrans(__LINE__, NULL, "commit");
#line 118 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 118 "outofscope.pgc"

    strcpy(msg, "disconnect");
    {
        ECPGdisconnect(__LINE__, "CURRENT");
#line 121 "outofscope.pgc"

        if (sqlca.sqlcode < 0)
            exit(1);
    }
#line 121 "outofscope.pgc"

    return (0);
}
